package main

import (
    "fmt"
    "time"
    "math"
)

const TIME int64 = 17

type Server struct {
    Time   int64
    Ticker *time.Ticker
}

func (s *Server) start() {
    s.Time = time.Now().UnixNano()
    s.Ticker = time.NewTicker(time.Duration(TIME) * time.Millisecond)
    //s.onLoop()
    //s.update()
}

func (s *Server) update() {
    t := <-s.Ticker.C
    // 准备执行向客户端发消息逻辑, 此种方法是阻塞行为, 实际项目中需要使用go抛到单独进程执行
    spend := (t.UnixNano() - s.Time) / 1e6;
    if math.Abs(float64(spend - TIME)) > 5 {
        fmt.Println(spend)
    }
    s.Time = t.UnixNano()
    s.update()
}

func (s *Server) onLoop() {
    for {
        select {
        case t := <-s.Ticker.C:
        // 这里不写Select的default情况下是阻塞的~
        // 准备执行向客户端发消息逻辑
            spend := (t.UnixNano() - s.Time) / 1e6;
            if math.Abs(float64(spend - TIME)) > 5 {
                fmt.Println(spend)
            }
            s.Time = t.UnixNano()
        default:
        // 准备执行其他逻辑
        }
    }
}

func main() {
    s := Server{}
    s.start()
}
